import System from "../System";
import { hook } from "../utils/hook";

/**
 * 资源管理类是用来管理 Laya 资源的一个类，
 * 比如所有的子弹的实体都应该放置在一个管理类内
 *   管理类在个体被删除时自动去除关系
 *   管理类能够直接删除个体
 * 上面两个关系都是通过 内部的 destroy 函数实现的
 */

export class ResourceManager<T extends Laya.Sprite = Laya.Sprite> {
    get container() {
        return this.System.Camera.stage;
    }
    System: typeof System;
    private AllResources = new Set<T>();
    get size() {
        return this.AllResources.size;
    }
    constructor(control: typeof System) {
        this.System = control;
    }

    addResource(Resource: T) {
        this.container.addChildren(Resource);
        this.AllResources.add(this._hookResource(Resource));
    }
    addResources(Resources: T[]) {
        this.container.addChildren(...Resources);
        Resources.forEach((i) => this.AllResources.add(this._hookResource(i)));
    }
    removeResource(B: T) {
        this.AllResources.delete(B);
        B.destroy();
    }
    removeResources(func: (b: T) => boolean) {
        [...this.AllResources.values()]
            .filter((i) => {
                return func(i);
            })
            .forEach((Resource) => {
                Resource.destroy();
            });
    }
    _hookResource(Resource: T) {
        hook(Resource, "onDestroy", {
            after: () => {
                // console.log("销毁子弹");
                this.AllResources.delete(Resource);
            },
        });
        return Resource;
    }
}
